package com.txc.common.utils.jwt;

import io.jsonwebtoken.Claims;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

import static com.txc.common.global.constant.StrConstant.*;

/**
 * @ClassName: TokenManager
 * @Author: TXC
 * @Date: 2023-07-30 16:30
 **/
@Component
@ConfigurationProperties(prefix = "security.token")
@Data
public class TokenManager {
    // 设置token私钥
    private String secret;
    // 设置token过期时间
    private long expire = 3600 * 24 * 7 * 1000;

    private final String cacheKey = "auth:userinfo:";

    /**
     * 创建token
     * @param username 用户名
     * @return java.lang.String
     */
    public String createToken(String username, String userId) {
        Map<String, Object> claims = new HashMap<>(2);
        claims.put(USERNAME, username);
        claims.put(USER_ID, userId);
        return JwtTokenUtil.createToken(secret, claims, expire);
    }

    /**
     * 解析token
     * @param token token
     * @return io.jsonwebtoken.Claims
     */
    public Claims parserToken(String token) {
        return JwtTokenUtil.parserToken(token, secret);
    }

    /**
     * 刷新token
     * @param token token
     * @return java.lang.String
     */
    public String refreshToken(String token) {
        return JwtTokenUtil.createToken(secret, JwtTokenUtil.parserToken(token, secret), expire);
    }

    /**
     * token是否过期
     * @param token token
     * @return boolean
     */
    public boolean isExpiration(String token) {
        return JwtTokenUtil.parserToken(token, secret).getExpiration().before(new java.util.Date());
    }

    /**
     * 通过token获取用户名
     * @param token token
     * @return java.lang.String
     */
    public String getUsername(String token) {
        return parserToken(token).get(USERNAME).toString();
    }

    /**
     * 通过token获取用户名
     * @param token token
     * @return java.lang.String
     */
    public String getUserId(String token) {
        return parserToken(token).get(USER_ID).toString();
    }
}
